﻿namespace Common.Protocol
{
    using System;
    using System.Collections.Generic;

    public class BlockHeader
    {
        // Прапорець = 0хFFFFFF7F
        public Int32 Magic;
        // Ідентифікатор блока
        public Int32 BlockId;
        // Фізична адреса заголовка попереднього блока
        public Int32 HeaderPrev;
        // Фізична адреса заголовка наступного блока - не використовується
        public Int32 HeaderNext;

        // Віртуальна адреса початку даних блоку
        public Int64 DataOffset;
        // ! - Адреса байта після кінця даного блока
        public Int32 DataEnd;

        // Тривалість блока в мілісекундах
        public Int32 TimeMs;
        // Час від початку блока в форматі лінкуса * 1000
        private Int64 StartMs;
        public byte EndLine;
        public byte[] Reserved = new byte[7];
        public List<ChannelConfig> Channels = new List<ChannelConfig>();
        public byte[] Reserved2 = new byte[336];

        public DateTime Start { get; private set; }

        public DateTime End { get; private set; }

        public BlockHeader()
        {
            this.Reserved = new byte[7];
            this.Reserved2 = new byte[336];
        }

        public void ParseFromBinary(byte[] bytes, int offset)
        {
            int position = offset;
            this.Magic = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.BlockId = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.HeaderPrev = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.HeaderNext = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.DataOffset = BitConverter.ToInt64(bytes, position);
            position += 8;
            this.DataEnd = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.TimeMs = BitConverter.ToInt32(bytes, position);
            position += 4;
            this.StartMs = BitConverter.ToInt64(bytes, position);
            position += 8;
            this.EndLine = bytes[position];
            position++;
            Array.Copy(bytes, position, this.Reserved, 0, 7);
            position += 7;
            for (int i = 0; i < 32; i++)
            {
                ChannelConfig channel = new ChannelConfig();
                if (channel.ParseFromBinary(bytes, position))
                {
                    this.Channels.Add(channel);
                }

                position += 52;
            }


            this.Start = new DateTime(this.StartMs * 10000);
            this.Start = this.Start.AddYears(1969);
            this.End = this.Start.AddMilliseconds(this.TimeMs);
        }
    }
}